home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / LIBIP / CONVOLVE.C < prev    next >
C/C++ Source or Header  |  1999-09-11  |  2KB  |  73 lines

  1. /* 
  2.  * convolve.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <math.h>
  12. #include "ip.h"
  13. #include "convolve.h"
  14.  
  15. /*
  16.  * convolve()
  17.  *   DESCRIPTION:
  18.  *     convolve performs a 2-D convolution on ImageIn
  19.  *     using Kernel as the kernel and
  20.  *     placing the convolved image in ImageOut
  21.  *   ARGUMENTS:
  22.  *     ImageIn(Image *) pointer to input image struct (see tiffimage.h)
  23.  *     ImageOut(Image *) pointer to output image struct (see tiffimage.h)
  24.  *     Kernel(Matrix *) pointer to convolution kernel struct (see convolve.h)
  25.  *   RETURN VALUE:
  26.  *     0
  27.  */
  28. int
  29. convolve (Image * ImageIn, Image * ImageOut, Matrix * Kernel)
  30. {
  31.  
  32.   int row, column, i, j;
  33.   int kernel_rows, kernel_cols, dead_rows, dead_cols;
  34.   float normal_factor;
  35.   unsigned char **pImgOut;
  36.   float sumval;
  37.   float *filptr;
  38.   int pixval;
  39.  
  40.  
  41.   pImgOut = ImageOut->img;
  42.   kernel_rows = Kernel->nRows;
  43.   kernel_cols = Kernel->nCols;
  44.  
  45.   dead_rows = kernel_rows / 2;
  46.   dead_cols = kernel_cols / 2;
  47.  
  48.   normal_factor = (float) 0.0;
  49.   for (row = 0; row < kernel_rows; row++) {
  50.     filptr = Kernel->matrix[row];
  51.     for (column = 0; column < kernel_cols; column++)
  52.       normal_factor += (float) (Kernel->matrix[row][column]);
  53.   }
  54.  
  55.   if (!normal_factor)
  56.     normal_factor = (float) 1;
  57.  
  58.   for (row = 0; row < (ImageIn->height) - kernel_rows + 1; row++) {
  59.     for (column = 0; column < (ImageIn->width) - kernel_cols + 1; column++) {
  60.       sumval = (float) 0.0;
  61.       for (i = 0; i < kernel_rows; i++) {
  62.         for (j = 0; j < kernel_cols; j++) {
  63.           sumval += (ImageIn->img[i + row][j + column]) * (Kernel->matrix[i][j]);
  64.         }
  65.       }
  66.       if ((pixval = abs ((int) (sumval / normal_factor))) > 255)
  67.         pixval = 255;
  68.       pImgOut[row + dead_rows][column + dead_cols] = (unsigned char) pixval;
  69.     }
  70.   }
  71.   return (0);
  72. }
  73.